package com.chenhs.oop.study.集合;

/**
 * @program: JAVA300
 * @description: 手动实现LinKdelist（链表）
 * @author: peanut
 * @create: 2019-03-09 16:43
 */
public class TestLinkedList {
    //第一个节点
    private Node first;
    //最后一个节点
    private Node last;
    //链表的长度.
    private int size;

    /**
     * @Description: 添加节点
     * @Param: * @param null
     * @return:
     * @Author: peanut
     * @date 2019/3/10 20:54
     */
    public void addelement(Object oop) {
        /*添加节点时分为第一次添加和非第一次添加*/
        Node node = new Node(oop);
        if (first == null) {
            first = node;
            last = node;
        } else {
            /*处理本节点的上关系*/
            node.previouse = last;
            node.next = null;
            /*将要加入的节点赋值给上一个最后的节点（也就是last，因为当前节点未加入时它就是最后的节点）的next属性。*/
            last.next = node;
            /*将自己设置为最后一个节点。*/
            last = node;
            size++;
        }
    }

    /**
     * @Description: 用于遍历元素。
     * @Param: * @param null
     * @return:
     * @Author: peanut
     * @date 2019/3/10 21:58
     */
    @Override
    public String toString() {
        Node value = this.first;
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        while (value != null) {
            sb.append(value.element);
            sb.append(",");
            /*因为上一个对象的next属性就是下一个对象，所有用当前对象的next可以找的下一个对象*/
            value = value.next;
        }
        String ss = sb.replace(sb.length() - 1, sb.length(), "]").toString();
        return ss;
    }

    /**
     * @param
     * @Description: 通过下标获取链表中的元素
     * @Param:
     * @return:
     * @Author: peanut
     * @date 2019/3/11 22:20
     */
    public Node getElement(int index) {
        if (index > size) {
            throw new RuntimeException("下标超出范围" + "当前最大下标为" + size + ",下标为：" + index);
        }
        /*  1 下标不合法   2 查询效率*/
        Node map = null;
        if (index < size >> 1) {
            map = first;
            for (int i = 0; i < index; i++) {
                map = map.next;
            }
        } else {
            map = last;
            int j = (size - index);
            for (int i = j; j > 0; j--) {
                map = map.previouse;
            }
        }

        Object element = map.getElement();
        return map;
    }

    /**
     * @Description: 删除节点
     * @Param: * @param null
     * @return:
     * @Author: peanut
     * @date 2019/3/13 23:55
     */
    public void removeElemnt(int index) {

        Node node = getElement(index);
        System.out.println(node.getElement());
        Node previouse = node.previouse;
        Node next = node.next;
        if (previouse != null) {
           /* 如果需要删除的不是第一个*/
            previouse.next = next;
        }else {
            /* 如果需要删除的是第一个*/
            next.previouse=null;
            first=next;
        }
        if (next != null) {
            /*如果需要删除的不是第一个*/
            next.previouse=previouse;
        }else {
            /*如果需要删除的是第一个*/
            previouse.next=null;
            last=previouse;
        }
        size--;
    }

    public static void main(String[] args) {
        TestLinkedList testLinkedList = new TestLinkedList();
        testLinkedList.addelement("a");
        testLinkedList.addelement("b");
        testLinkedList.addelement("c");
        testLinkedList.addelement("哈哈哈哈");
        testLinkedList.removeElemnt(0);
        System.out.println(testLinkedList.toString());
//        System.out.println(testLinkedList.getElement(8).toString());
    }

}
